package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {

	// 保存服务器的socket
	private ServerSocket serverSocket;
	
	// 保存在线用户的sender列表
	private ArrayList<ServerSender> senderList = new ArrayList<>();

	// 保存在线用户的socket列表
	private ArrayList<Socket> userList = new ArrayList<>(); // 存储用户InetAddress信息

	// 构造函数开始服务器：启动发监听线程
	public Server() throws IOException {
		serverSocket = new ServerSocket(6666); // 监听指定端口
		System.out.println("服务器开始运行..."); // 运行提示
		// 循环接受连接请求
		while (true) {
			Socket sock = serverSocket.accept(); // 等待连接
			System.out.println("用户 " + sock.getRemoteSocketAddress()+"连接成功"); // 连接成功
			this.userList.add(sock); // 把连接的对象添加到userList
			System.out.println("添加用户"+sock.getInetAddress().toString()+"成功 "+"当前在线"+userList.size()+"人");
			// 通知已有所有用户新加了用户
			if (this.userList.size() > 1) {
				tellOthers(sock);
			}
			// 发送者
			ServerSender s = new ServerSender(sock);
			s.start();
			senderList.add(s);
			// 监听者
			ServerListener l = new ServerListener(sock,senderList,userList); // 开启新线程处理传输
			l.start();
			// 大于一人时 连接后给新用户更新朋友圈
			if(userList.size()>1)
				matchUser(sock,s);
			
		}

	}

	// 给新用户更新朋友圈
	private void matchUser(Socket sock, ServerSender sender) {
		System.out.println("开始将其他用户告诉本用户");
		// 遍历用户 将每个用户的地址发给本用户(sender)
		for(var user : userList) {
			if(!(user.getInetAddress().toString().equals(sock.getInetAddress().toString()))) { // 所有出自己以外的user
				System.out.println(user.getInetAddress().toString()+" =？ "+ sock.getInetAddress().toString());
				sender.sendMessage("d"+user.getInetAddress().toString()); // 编码将所有用户的地址传给sock
			}
		}
	}
	
	// 通知用户新增加的人
	private void tellOthers(Socket s) {
		System.out.println("通知用户新增的人");
		// 遍历发消息者 将本用户告知每个其他用户（此时sock尚未添加到userList）
		for (var sender : senderList) {
			if(!(s.getInetAddress().toString().equals(sender.getSock().getInetAddress().toString())))
			sender.sendMessage("d"+s.getInetAddress().toString());

		}

	}


	// 主函数开始服务
	public static void main(String[] args) throws IOException {
		
		Server server = new Server();

	}
	
}